<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Kafka 请求处理流程详解</title>
    <link href="https://cdn.staticfile.org/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
    <link href="https://cdn.staticfile.org/tailwindcss/2.2.19/tailwind.min.css" rel="stylesheet">
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/mermaid@latest/dist/mermaid.min.js"></script>
    <style>
        body {
            font-family: 'Noto Sans SC', Tahoma, Arial, Roboto, "Droid Sans", "Helvetica Neue", "Droid Sans Fallback", "Heiti SC", "Hiragino Sans GB", Simsun, sans-serif;
            background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
            min-height: 100vh;
        }
        .hero-gradient {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        }
        .card-hover {
            transition: all 0.3s ease;
        }
        .card-hover:hover {
            transform: translateY(-5px);
            box-shadow: 0 20px 40px rgba(0,0,0,0.1);
        }
        .number-circle {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            width: 40px;
            height: 40px;
            display: flex;
            align-items: center;
            justify-content: center;
            border-radius: 50%;
            color: white;
            font-weight: bold;
            flex-shrink: 0;
        }
        .section-title {
            position: relative;
            padding-left: 20px;
        }
        .section-title::before {
            content: '';
            position: absolute;
            left: 0;
            top: 50%;
            transform: translateY(-50%);
            width: 4px;
            height: 24px;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            border-radius: 2px;
        }
        .feature-icon {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
        }
        .mermaid {
            background: white;
            padding: 2rem;
            border-radius: 1rem;
            box-shadow: 0 10px 30px rgba(0,0,0,0.1);
        }
        @keyframes fadeInUp {
            from {
                opacity: 0;
                transform: translateY(30px);
            }
            to {
                opacity: 1;
                transform: translateY(0);
            }
        }
        .animate-fadeInUp {
            animation: fadeInUp 0.6s ease-out;
        }
    </style>
</head>
<body>
    <!-- Hero Section -->
    <div class="hero-gradient text-white py-20">
        <div class="container mx-auto px-6">
            <div class="max-w-4xl mx-auto text-center animate-fadeInUp">
                <h1 class="text-5xl font-bold mb-6">Kafka 请求处理流程</h1>
                <p class="text-xl opacity-90 leading-relaxed">
                    深入解析 Apache Kafka 如何以高吞吐量、低延迟和高可靠性处理海量消息请求
                </p>
                <div class="mt-10 flex justify-center space-x-8">
                    <div class="text-center">
                        <i class="fas fa-rocket text-4xl mb-2"></i>
                        <p class="text-sm">高吞吐量</p>
                    </div>
                    <div class="text-center">
                        <i class="fas fa-bolt text-4xl mb-2"></i>
                        <p class="text-sm">低延迟</p>
                    </div>
                    <div class="text-center">
                        <i class="fas fa-shield-alt text-4xl mb-2"></i>
                        <p class="text-sm">高可靠性</p>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <!-- Main Content -->
    <div class="container mx-auto px-6 py-12">
        <!-- Introduction -->
        <div class="max-w-4xl mx-auto mb-16">
            <div class="bg-white rounded-2xl shadow-xl p-8 card-hover">
                <p class="text-lg leading-relaxed text-gray-700 indent-8">
                    Kafka 处理请求的流程可以分为多个阶段，每个阶段负责特定的任务。Kafka 的设计旨在提供高吞吐量、低延迟和高可靠性的消息处理服务，使其在大规模数据流和流处理场景中表现出色。
                </p>
            </div>
        </div>

        <!-- Process Flow Visualization -->
        <div class="max-w-6xl mx-auto mb-16">
            <h2 class="text-3xl font-bold text-center mb-8 text-gray-800">请求处理流程图</h2>
            <div class="mermaid">
                graph TD
                    A[客户端请求] -->|生产者/消费者| B[Broker 接收请求]
                    B --> C{请求类型}
                    C -->|写入请求| D[消息写入]
                    C -->|读取请求| E[消息读取]
                    D --> F[写入日志]
                    F --> G[消息复制]
                    E --> H[读取日志]
                    H --> I[位移管理]
                    G --> J[请求响应]
                    I --> J
                    J --> K[故障处理]
                    K --> L[领导者故障转移]
                    K --> M[数据恢复]
                    
                    style A fill:#667eea,stroke:#fff,stroke-width:2px,color:#fff
                    style B fill:#764ba2,stroke:#fff,stroke-width:2px,color:#fff
                    style J fill:#667eea,stroke:#fff,stroke-width:2px,color:#fff
            </div>
        </div>

        <!-- Process Steps -->
        <div class="max-w-5xl mx-auto">
            <!-- Step 1 -->
            <div class="mb-12 bg-white rounded-2xl shadow-xl p-8 card-hover">
                <div class="flex items-start mb-6">
                    <div class="number-circle mr-4">1</div>
                    <h3 class="text-2xl font-bold text-gray-800">客户端请求</h3>
                </div>
                <div class="grid md:grid-cols-2 gap-6">
                    <div class="bg-purple-50 rounded-xl p-6">
                        <div class="flex items-center mb-3">
                            <i class="fas fa-paper-plane feature-icon text-2xl mr-3"></i>
                            <h4 class="text-lg font-semibold text-gray-800">生产者请求</h4>
                        </div>
                        <p class="text-gray-700 leading-relaxed">
                            当生产者（Producer）发送消息到 Kafka 时，它会先选择一个 Kafka 主题（Topic）及其分区（Partition）。生产者会将消息发送到指定的分区，并将其请求发送到集群中的一个 Kafka Broker。
                        </p>
                    </div>
                    <div class="bg-blue-50 rounded-xl p-6">
                        <div class="flex items-center mb-3">
                            <i class="fas fa-download feature-icon text-2xl mr-3"></i>
                            <h4 class="text-lg font-semibold text-gray-800">消费者请求</h4>
                        </div>
                        <p class="text-gray-700 leading-relaxed">
                            消费者（Consumer）向 Kafka 请求消息时，它会指定一个主题（Topic）和一个分区（Partition），并且可能会指定一个消费者组（Consumer Group）。消费者的请求会发送到集群中的一个 Kafka Broker。
                        </p>
                    </div>
                </div>
            </div>

            <!-- Step 2 -->
            <div class="mb-12 bg-white rounded-2xl shadow-xl p-8 card-hover">
                <div class="flex items-start mb-6">
                    <div class="number-circle mr-4">2</div>
                    <h3 class="text-2xl font-bold text-gray-800">Broker 接收请求</h3>
                </div>
                <div class="space-y-4">
                    <div class="flex items-start">
                        <i class="fas fa-route text-purple-600 text-xl mr-4 mt-1"></i>
                        <div>
                            <h4 class="font-semibold text-gray-800 mb-2">请求路由</h4>
                            <p class="text-gray-700 leading-relaxed">
                                Kafka Broker 接收到生产者或消费者的请求后，会根据请求的主题和分区信息来确定具体的分区。如果请求的分区信息在当前 Broker 上，则直接处理；否则，将请求路由到拥有该分区的 Broker。
                            </p>
                        </div>
                    </div>
                    <div class="flex items-start">
                        <i class="fas fa-cogs text-purple-600 text-xl mr-4 mt-1"></i>
                        <div>
                            <h4 class="font-semibold text-gray-800 mb-2">请求处理</h4>
                            <p class="text-gray-700 leading-relaxed">
                                Kafka Broker 处理请求，包括接收消息、写入消息到日志文件、读取消息等操作。
                            </p>
                        </div>
                    </div>
                </div>
            </div>

            <!-- Step 3 -->
            <div class="mb-12 bg-white rounded-2xl shadow-xl p-8 card-hover">
                <div class="flex items-start mb-6">
                    <div class="number-circle mr-4">3</div>
                    <h3 class="text-2xl font-bold text-gray-800">消息写入</h3>
                </div>
                <div class="space-y-4">
                    <div class="flex items-start">
                        <i class="fas fa-save text-purple-600 text-xl mr-4 mt-1"></i>
                        <div>
                            <h4 class="font-semibold text-gray-800 mb-2">消息写入日志</h4>
                            <p class="text-gray-700 leading-relaxed">
                                当生产者请求消息写入到 Kafka 时，Broker 会将消息写入到分区的日志文件中。Kafka 使用高效的顺序写入机制，保证消息的持久化和高吞吐量。
                            </p>
                        </div>
                    </div>
                    <div class="flex items-start">
                        <i class="fas fa-copy text-purple-600 text-xl mr-4 mt-1"></i>
                        <div>
                            <h4 class="font-semibold text-gray-800 mb-2">消息复制</h4>
                            <p class="text-gray-700 leading-relaxed">
                                Kafka 使用分区副本机制来保证数据的高可用性和容错性。每个分区有一个领导者（Leader）和若干个副本（Follower）。消息写入到领导者分区后，领导者会将消息异步地复制到所有副本。如果领导者不可用，会选举一个新的领导者来继续处理请求。
                            </p>
                        </div>
                    </div>
                </div>
            </div>

            <!-- Step 4 -->
            <div class="mb-12 bg-white rounded-2xl shadow-xl p-8 card-hover">
                <div class="flex items-start mb-6">
                    <div class="number-circle mr-4">4</div>
                    <h3 class="text-2xl font-bold text-gray-800">消息读取</h3>
                </div>
                <div class="space-y-4">
                    <div class="flex items-start">
                        <i class="fas fa-book-open text-purple-600 text-xl mr-4 mt-1"></i>
                        <div>
                            <h4 class="font-semibold text-gray-800 mb-2">消费者读取消息</h4>
                            <p class="text-gray-700 leading-relaxed">
                                消费者请求消息时，Kafka Broker 从分区的日志中读取消息。消费者可以从日志的任意位置开始读取消息，并且可以通过提交位移（offset）来跟踪已经消费的消息。
                            </p>
                        </div>
                    </div>
                    <div class="flex items-start">
                        <i class="fas fa-map-marker-alt text-purple-600 text-xl mr-4 mt-1"></i>
                        <div>
                            <h4 class="font-semibold text-gray-800 mb-2">位移管理</h4>
                            <p class="text-gray-700 leading-relaxed">
                                消费者在消费消息时，会维护自己的位移（offset）。位移可以存储在 Kafka 自身的内部主题中，或者存储在外部的存储系统中。位移用于记录消费者的进度，并确保消费者从正确的位置继续消费消息。
                            </p>
                        </div>
                    </div>
                </div>
            </div>

            <!-- Step 5 -->
            <div class="mb-12 bg-white rounded-2xl shadow-xl p-8 card-hover">
                <div class="flex items-start mb-6">
                    <div class="number-circle mr-4">5</div>
                    <h3 class="text-2xl font-bold text-gray-800">请求响应</h3>
                </div>
                <div class="grid md: